Vinnaren i pepparkakshustävlingen!
2023-03-01, 17:15
  #1
Medlem
Kottkompotts avatar
Jag sitter på en lång CSV-fil jag behöver kunna sortera och ha sig med, men det muppar sig eftersom den är seikolonseparerad och dessutom innehåller en massa HTML-entities, vilka består av semikolon.
Vissa celler innehåller ÅÄÖ som vanligt, och vissa innehåller grejer som ä och å istället.

Jag har förstökt med iconv() och html_entity_decode(), men antingen funkar det inte alls, eller så funkar det för HTML-grejerna, men raderar i samma veva alla vanliga ÅÄÖ.

Hur kan man lösa detta?
Citera
2023-03-01, 18:28
  #2
Medlem
Citat:
Ursprungligen postat av Kottkompott
Jag sitter på en lång CSV-fil jag behöver kunna sortera och ha sig med, men det muppar sig eftersom den är seikolonseparerad och dessutom innehåller en massa HTML-entities, vilka består av semikolon.
Vissa celler innehåller ÅÄÖ som vanligt, och vissa innehåller grejer som ä och å istället.

Jag har förstökt med iconv() och html_entity_decode(), men antingen funkar det inte alls, eller så funkar det för HTML-grejerna, men raderar i samma veva alla vanliga ÅÄÖ.

Hur kan man lösa detta?

Har du testat find and replace?
Citera
2023-03-01, 18:56
  #3
Medlem
Citat:
Ursprungligen postat av Kottkompott
Jag sitter på en lång CSV-fil jag behöver kunna sortera och ha sig med, men det muppar sig eftersom den är seikolonseparerad och dessutom innehåller en massa HTML-entities, vilka består av semikolon.
Vissa celler innehåller ÅÄÖ som vanligt, och vissa innehåller grejer som ä och å istället.

Jag har förstökt med iconv() och html_entity_decode(), men antingen funkar det inte alls, eller så funkar det för HTML-grejerna, men raderar i samma veva alla vanliga ÅÄÖ.

Hur kan man lösa detta?
HTML-entities löser man med html_entity_decode(), ev med passande encoding angiven.
Fältskiljartecken är inget problem, det kan man ange när man anropar den CSV-funktion som man tänker använda.
Behövs fler detaljer för att lösa mer än så..
Citera
2023-03-01, 19:15
  #4
Medlem
Kottkompotts avatar
Citat:
Ursprungligen postat av Msanvil76
Har du testat find and replace?
Nu när du nämner det så är förstås vanlig replace bättre. Tänkte att det var fler tecken det gällde, men det är antagligen bara tre.
Tack!
Citera
2023-03-03, 22:43
  #5
Medlem
Retropropagations avatar
Citat:
Ursprungligen postat av Kottkompott
Jag sitter på en lång CSV-fil jag behöver kunna sortera och ha sig med, men det muppar sig eftersom den är seikolonseparerad och dessutom innehåller en massa HTML-entities, vilka består av semikolon.
Vissa celler innehåller ÅÄÖ som vanligt, och vissa innehåller grejer som ä och å istället.

Jag har förstökt med iconv() och html_entity_decode(), men antingen funkar det inte alls, eller så funkar det för HTML-grejerna, men raderar i samma veva alla vanliga ÅÄÖ.

Hur kan man lösa detta?

Jag gjorde ett Python-program istället för PHP. Som synes är jag total nybörjare på Python & encoding. Hur som helst funkar programmet i Python 3 i Windows 10. Enjoy!

Kod:
# Från http://www.tiger.se/dok/koder.html (internetmuseum@internetstiftelsen.se)
Tecken_Text = (
    ('Å', 	'Å'),
    ('Ä', 	'Ä'),
    ('Ö', 	'Ö'),
    ('å', 	'å'),
    ('ä', 	'ä'),
    ('ö', 	'ö'),
)

encoding = 'utf-8' # Behövs åtminstone för Windows 10

orig = 1 # 1 är kolumn 2...
copy = 1 - orig

s = open('Flashback.htm', 'r', encoding=encoding).read()

for k in range(len(Tecken_Text)):
    s = s.replace(Tecken_Text[k][orig], Tecken_Text[k][copy])

open('Flashback_åäö.htm', 'w', encoding=encoding).write(s)

Om Flashback.htm har detta innehåll:

Kod:
Ödgärd är en ökänd häxa.
Åsa är däremot görsöt.
Än så länge.

Kommer Flashback_åäö.htm att innehålla:

Kod:
Ödgärd är en ökänd häxa.
Åsa är däremot görsöt.
Än så länge.
Citera
2023-03-03, 22:54
  #6
Medlem
Kottkompotts avatar
Citat:
Ursprungligen postat av Retropropagation
Jag gjorde ett Python-program istället för PHP. Som synes är jag total nybörjare på Python & encoding. Hur som helst funkar programmet i Python 3 i Windows 10. Enjoy!

Kod:
# Från http://www.tiger.se/dok/koder.html (internetmuseum@internetstiftelsen.se)
Tecken_Text = (
    ('Å', 	'Å'),
    ('Ä', 	'Ä'),
    ('Ö', 	'Ö'),
    ('å', 	'å'),
    ('ä', 	'ä'),
    ('ö', 	'ö'),
)

encoding = 'utf-8' # Behövs åtminstone för Windows 10

orig = 1 # 1 är kolumn 2...
copy = 1 - orig

s = open('Flashback.htm', 'r', encoding=encoding).read()

for k in range(len(Tecken_Text)):
    s = s.replace(Tecken_Text[k][orig], Tecken_Text[k][copy])

open('Flashback_åäö.htm', 'w', encoding=encoding).write(s)

Om Flashback.htm har detta innehåll:

Kod:
Ödgärd är en ökänd häxa.
Åsa är däremot görsöt.
Än så länge.

Kommer Flashback_åäö.htm att innehålla:

Kod:
Ödgärd är en ökänd häxa.
Åsa är däremot görsöt.
Än så länge.
Jo det blev exakt sådär jag gjorde också, fast med några tecken till.
Visade sig att jag behövde rensa hela rasket i Excel också och uppdatera databasen manuellt. Är ett extremt mickel att ha semikolon i texterna inuti en semikolonseparerade fil, men magiskt nog så kunde Excel förstå det ändå.
Så för att det fortfarande skulle vara estetiskt så bytte jag ut alla semikolon till vanliga kolon, det bör inte spela någon större roll i produktbeskrivningar, hoppas jag (*svettas intensivt*).
Tur bara jag insåg att de där tecknen var där innan jag rensade rasket på semikolon.

Nu måste jag bara som ett av de första stegen i min IT-karriär försöka göra om den här databasen (ja det var tyvärr en databas jag pysslade med....) till SQL eller nåt om det går.
Jag ser inte jättemycket fram emot det.

Att bygga program för att uppdatera enstaka celler i CSV är lite fruktansvärt.
Känns som att ställa upp i brännbollsyran med ett skohorn i näven.

Å andra sidan, det var ju precis sånt här jag ville jobba med.
Det är engagerande och lite kul att ha fria tyglar till hur jag ska lösa grejer, bara det går göra inom vissa tidsramar.
__________________
Senast redigerad av Kottkompott 2023-03-03 kl. 23:11.
Citera
2023-03-03, 23:12
  #7
Medlem
Retropropagations avatar
Citat:
Ursprungligen postat av Kottkompott
Nu måste jag bara som ett av de första stegen i min IT-karriär försöka göra om den här databasen (ja det var tyvärr en databas jag pysslade med....) till SQL eller nåt om det går.
Jag ser inte jättemycket fram emot det.

Att bygga program för att uppdatera enstaka celler i CSV är fruktansvärt.

Ett litet tips...

Det finns en väldigt bra distanskurs på BTH:

https://dbwebb.se/kurser/webtec-v2

Citat:
Kursen Webbteknologier, a.k.a. webtec, lär ut webbutveckling där teknikerna HTML, CSS, PHP och SQL används för att tillsammans bygga en databasdriven webbplats.

Föreläsningarna finns här:

https://www.youtube.com/watch?v=K7F5...cg9Nk4sdkw4y9t

Jag kan mycket väl tänka mig att det är Sveriges bästa distanskurs. Alla kategorier.

Kursmoment 5 & 6 kan kanske vara något för dig:

Citat:
Kmom05: SQL och SQLite

Kmom06: PHP, PDO och SQL
Citera
2023-03-03, 23:24
  #8
Medlem
Kottkompotts avatar
Citat:
Ursprungligen postat av Retropropagation
Ett litet tips...

Det finns en väldigt bra distanskurs på BTH:

https://dbwebb.se/kurser/webtec-v2



Föreläsningarna finns här:

https://www.youtube.com/watch?v=K7F5...cg9Nk4sdkw4y9t

Jag kan mycket väl tänka mig att det är Sveriges bästa distanskurs. Alla kategorier.

Kursmoment 5 & 6 kan kanske vara något för dig:
Jag har redan läst webbutveckling på både komvux och högskola, dock bara komvux kursen som skummade över php lite.
Har lärt mig mer om det första 10 timmarna på jobbet än jag lärde mig där, men egentligen har jag bara skohornet in saker eftersom. Har inget egentligt fundament i just PHP, utan kommer tidigare från C# och Python.
Det här med att arrays skapas i kronologisk ordning och inte indexordning var ett gigantiskt huvudbry innan det uppenbarades.

Läser en databaskurs just nu, tror det mer praktiska i SQL dyker upp om några veckor.
Men har hört av kursare att BTH är jättebra, så jag ska fundera på det till efter sommaren, om inte poängen krockar eller så.

Men en fråga:
Har CSV några egentliga fördelar i t.ex. hastighet eller att det är lättare att implementera, eller är det något fuskjobb jag har stött på?
Jag har faktiskt ingen aning vad som är konsensus.

Av det lilla jag gjort i SQL tidigare så skulle det i många avseenden vara rena himmelriket mot att ha en produktdatabas på tiotusentals rader i CSV.
Men jag har ingen aning om hur bökigt det är att strukturera om den från CSV till SQL, och om vår wordpressplugin tillåter det.
__________________
Senast redigerad av Kottkompott 2023-03-03 kl. 23:31.
Citera
2023-03-04, 00:15
  #9
Medlem
Retropropagations avatar
Citat:
Ursprungligen postat av Kottkompott
Men en fråga:
Har CSV några egentliga fördelar i t.ex. hastighet eller att det är lättare att implementera, eller är det något fuskjobb jag har stött på?
Jag har faktiskt ingen aning vad som är konsensus.

Av det lilla jag gjort i SQL tidigare så skulle det i många avseenden vara rena himmelriket mot att ha en produktdatabas på tiotusentals rader i CSV.
Men jag har ingen aning om hur bökigt det är att strukturera om den från CSV till SQL, och om vår wordpressplugin tillåter det.

För mig är det tvärtom. CSV-filer tillsammans med Matlab eller RStudio "bara funkar för mig". Pandas i Python funkar nästan lika bra. Obs! Mina CSV-filer är mindre än 2 GByte.

Tillsammans med JSON och XML är nog CSV det vanligaste textfilsformatet.

CSV är minsta gemensamma nämnaren för dataöverföring (utdata/indata) för Excel, databaser, loggfiler, mätinstrument, maskininlärning, AI, "big data" etc, etc. (I Sverige har vi dock grymt stora problem med . , och ;)

Jag är absolut ingen expert, men några generella fördelar är: Backup och versionshantering för "små och medelstora databaser/datasets". Delning av data, se t.ex: https://www.kaggle.com/datasets

I Matlab, RStudio eller Python är det bara en enda rad för att läsa en CSV-fil. (Eller spara...)

Som jag förstod det kan du Python, så här enkelt jobbar du med ett dataset i Python. Programmet läser en CSV-fil (klicka på tabben "data.csv" för att se innehållet) och beräknar "CO2" mha maskininlärning.

https://www.w3schools.com/python/try...=demo_ml_coef2

Kod:
import pandas
from sklearn import linear_model

df = pandas.read_csv("data.csv")

X = df[['Weight', 'Volume']]
y = df['CO2']

regr = linear_model.LinearRegression()
regr.fit(X, y)

predictedCO2 = regr.predict([[3300, 1300]])

print(predictedCO2)
Lägg gärna till:

Kod:
print(df)
print(y.mean(), y.std())

sist i skriptet för ökad förståelse.
Citera
2023-03-04, 00:24
  #10
Moderator
vhes avatar
Citat:
Ursprungligen postat av Kottkompott
Har CSV några egentliga fördelar i t.ex. hastighet eller att det är lättare att implementera, eller är det något fuskjobb jag har stött på?

Nej. CSV är skit. Enda existensberättigandet det formatet har är att normies kan titta på en CSV-fil och tro att de begriper något. Så fort man faktiskt börjar arbeta med det stöter man på alla fallgropar (som du redan gjort!).

Det kan duga om man har extremt enkel data utan någon som helst "fritext" - tänk något som bara är.. jag vet inte, bilars registreringsnummer och tillverkningsår eller nått - där du med 100% säkerhet från börjat vet exakt vilka tecken som kommer vara möjliga i datan, och du kan välja ett separatortecken som garanterat inte överlappar med datan. Man stöter på det ibland med mätdata - där det egentligen bara är några kolumner med siffror. Då funkar det så klart också.

Så fort det blir faktiskt text involverad med vissa frihetsgrader så är det kört igen. Personnamn går bort. Adresser är inte ens att tänka på. Produktbeskrivningar? LOL!
Citera
2023-03-04, 23:01
  #11
Medlem
Citat:
Ursprungligen postat av Kottkompott
Jag sitter på en lång CSV-fil jag behöver kunna sortera och ha sig med, men det muppar sig eftersom den är seikolonseparerad och dessutom innehåller en massa HTML-entities, vilka består av semikolon.
Vissa celler innehåller ÅÄÖ som vanligt, och vissa innehåller grejer som ä och å istället.

Jag har förstökt med iconv() och html_entity_decode(), men antingen funkar det inte alls, eller så funkar det för HTML-grejerna, men raderar i samma veva alla vanliga ÅÄÖ.

Hur kan man lösa detta?


För att hantera en CSV-fil som innehåller HTML-entiteter och ÅÄÖ tecken, kan du använda följande steg:

Öppna CSV-filen med rätt teckenuppsättning:
Använd fopen() för att öppna filen och ange rätt teckenuppsättning, t.ex. 'utf-8'.

Läs in varje rad och cell i filen:
Använd fgetcsv() för att läsa in varje rad och cell i filen. Detta kommer att returnera en array med varje cell som ett element i arrayen.[/list]
Använd html_entity_decode() på cellerna som innehåller HTML-entiteter:
Loopa igenom varje cell i arrayen och använd html_entity_decode() för att konvertera alla HTML-entiteter till rätt tecken.

Använd mb_convert_encoding() för att hantera semikolon och ÅÄÖ tecken:
Använd mb_convert_encoding() för att konvertera semikolonseparat text till kommaseparerat format. Du kan också använda denna funktion för att konvertera ÅÄÖ tecken till rätt teckenuppsättning, t.ex. 'ISO-8859-1'.

Sortera eller bearbeta datan som önskat:
Sortera eller bearbeta datan som önskat, t.ex. genom att använda sort() eller usort() för att sortera efter en specifik kolumn i filen.

Här är en kodexempel som du kan använda som utgångspunkt:

// Öppna filen med rätt teckenuppsättning
$file = fopen('file.csv', 'r');
stream_filter_append($file, 'convert.iconv.utf-8/iso-8859-1', STREAM_FILTER_READ);

// Loopa igenom varje rad i filen
while (($row = fgetcsv($file, 0, ';')) !== false) {
// Loopa igenom varje cell i raden
foreach ($row as &$cell) {
// Konvertera HTML-entiteter
$cell = html_entity_decode($cell, ENT_QUOTES | ENT_XML1, 'UTF-8');
// Konvertera semikolonseparat text till kommaseparerat format
$cell = str_replace(';', ',', $cell);
}
// Sortera eller bearbeta datan som önskat
// t.ex. sort($row);
// skriv ut raden
echo implode(',', $row) . "\n";
}

// Stäng filen
fclose($file);


Detta kodexempel öppnar en CSV-fil med rätt teckenuppsättning, läser in varje rad och cell i filen, konverterar HTML-entiteter och semikolonseparat text, och skriver ut den bearbetade datan till standardutmatningen. Du kan sedan använda denna data som du önskar, t.ex. genom att skriva den till en ny fil eller bearbeta den på annat sätt.
__________________
Senast redigerad av Ryon 2023-03-04 kl. 23:05.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback